package com.ming_za.odupdaterserver.api;

import com.ming_za.odupdaterserver.core.service.ReturnBusinessPackage;
import com.ming_za.odupdaterserver.core.service.res.obj.MainUpdateItem;
import com.ming_za.odupdaterserver.core.service.res.obj.VersionItem;
import com.ming_za.odupdaterserver.core.sqlite.domain.MainVersion;
import com.ming_za.odupdaterserver.core.vo.resp.VersionInfoResp;

import java.util.List;
import java.util.Map;

public interface MainVersionManager {

    /**
     * 通过版本号和标签获取当前版本更新的内容
     * @param version 版本号
     * @param label 标签
     * @param published 是否为发布内容
     * @param clientVersion 客户端支持服务器的版本，用于区分不同客户端支持的内容
     * @return 存在内容时返回 {@link MainUpdateItem} 列表
     */
    ReturnBusinessPackage<List<MainUpdateItem>> getMainUpdateItems(Integer version, Long label, boolean published,int clientVersion);

    /**
     * 获取所有传入版本的资源，忽略标签
     * @param version 版本号
     * @return 存在内容时返回 MainUpdateItem 列表
     */
    ReturnBusinessPackage<List<MainUpdateItem>> getVersionResAll(Integer version);

    /**
     * 获取所有版本相关信息
     * @return {@link MainUpdateItem} 列表
     */
    Map<Integer, MainVersion> getMainUpdateItems();

    /**
     * 获取传入的version到最新版本之间的所有版本号
     * @param version 客户端当前版本
     * @param published 是否为发布内容
     * @return version到最新版本之间的所有版本号
     */
    List<Integer> getVersions(Integer version,boolean published);

    /**
     * 获取所有版本详细信息
     * @return 版本详细信息
     */
    List<VersionInfoResp> getAllVersionInfo();

    /**
     * 获取所有版本号
     * @return 版本号列表
     */
    List<Integer> getAllVersions();

    /**
     * 添加未发布资源
     */
    ReturnBusinessPackage<Void> addUnpublishedRes(Long resId,boolean isNecessary);

    /**
     * 创建未发布版本
     * @param isNecessary 是否必须更新
     */
    ReturnBusinessPackage<Void> newVersion(boolean isNecessary);

    /**
     * 发布版本
     * <pre>仅有一个未发布版，所以不需要传入版本号</pre>
     */
    ReturnBusinessPackage<Object> publishVersion();

    /**
     * 修改未发布版本的版本号
     * <pre>发布后的版本号无法修改</pre>
     * @param version 新版本号
     */
    ReturnBusinessPackage<Void> modifyVersion(Integer version);

    /**
     * 删除版本
     * <pre>不建议删除已发布的版本</pre>
     * @param version 需要删除的版本号
     */
    ReturnBusinessPackage<Void> removeVersion(Integer version);

//    /**
//     * 修改版本号内资源
//     * <pre>不建议修改已发布的版本</pre>
//     * @param version 版本号
//     * @param resItem 资源
//     */
//    void modifyVersionRes(MainUpdateItem resItem);

    /**
     * 删除版本号内的资源
     * <pre>不建议删除已发布的版本</pre>
     * @param version 版本号
     * @param resId 资源id
     */
    ReturnBusinessPackage<Void> removeVersionRes(Long[] resId, Integer version);

    /**
     * 获取传入资源所在的版本号
     * @param resId 资源id
     * @return 版本号
     */
    Integer getVersionOfRes(Long resId);
}
